package com.br.negocio.dao;

import java.util.Collections;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.stereotype.Service;

import com.br.negocio.vo.MotoristaVO;

@Service("motoristaDAO")
public class MotoristaDAO {

	@PersistenceContext
	private EntityManager entityManager;

	public void inserirMotorista(MotoristaVO motoristaVO) {
		try {
			entityManager.persist(motoristaVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao inserir motorista: " + e.getMessage(), e);
		}
	}
	
	public void atualizarMotorista(MotoristaVO motoristaVO) {
		try {
			entityManager.merge(motoristaVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao atualizar motorista: " + e.getMessage(), e);
		}
	}

	public void removerMotorista(MotoristaVO motoristaVO) {
		try {
			if (!entityManager.contains(motoristaVO)) {
				motoristaVO = entityManager.merge(motoristaVO);
			}
			entityManager.remove(motoristaVO);
		} catch (Exception e) {
			throw new RuntimeException("Erro ao remover motorista: " + e.getMessage(), e);
		}
	}

	public MotoristaVO obterMotorista(MotoristaVO motoristaVO) {
		try {
			return entityManager.find(MotoristaVO.class, motoristaVO.getCodigo());
		} catch (Exception e) {
			throw new RuntimeException("Erro ao buscar motorista: " + e.getMessage(), e);
		}
	}

	@SuppressWarnings("unchecked")
	public List<MotoristaVO> obterListaMotorista() {
		try {
				List<MotoristaVO> lista;
				lista = (List<MotoristaVO>) entityManager.createNamedQuery("loadAllMotorista").getResultList();
				
			if ((lista != null) && (!lista.isEmpty())) {
				return lista;
			} else {
				return Collections.EMPTY_LIST;
			}
		} catch (Exception e) {
			throw new RuntimeException("Erro ao carregar todos os motoristas.", e);
		}
	}
	
	public boolean validaDuplicado(MotoristaVO motoristaVO) {
		Query query = entityManager.createNamedQuery("findDuplicatedMotorista");
		query.setParameter("codigo", motoristaVO.getCodigo());
		query.setParameter("cpf", motoristaVO.getCpfCnpj());
		query.setParameter("cod_tipo_motorista", motoristaVO.getTipoMotorista());
		@SuppressWarnings("rawtypes")
		List lista = query.getResultList();
		if (lista.isEmpty()) {
			return true;
		} else {
			return false;
		}
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

}